%include "boot.inc"
section MBR vstart=0x7c00

	mov ax, cs
	mov ds, ax
	mov ss, ax
	mov sp, 0x7c00
	mov es, ax
	mov fs, ax

	mov ax, 0x0600 ;ah=0x06为上卷 al=0x00 为整个矩形都上卷
	mov bx, 0x0700
	mov cx, 0 ;左上角坐标
	mov dx, 0x184f ;右下角坐标 24*79
	int 0x10

	; mov ah, 3 ;获取光标位置功能号，dx光标行列，cx光标大小
	; mov bh, 0 ; 页号
	; int 0x10

	; mov ax, Message
	; mov bp, ax ;es:bp为字符串地址
	; mov cx, 5 ;输出字符串长度
	; mov ax, 0x1301 ;ah=13h是打印字符串功能号，al=01h是光标跟随
	; mov bx, 0x000a ;bl=0x0a字符为淡绿色
	; mov dx, 0 ;dh dl为起始行列
	; int 0x10 ;利用bios 0x10 中断显示字符

;	直接向显存写入，显示字符串
;	mov ax, 0xb800
;	mov gs, ax ;设置显存地址到段寄存器

;	mov byte [gs:0x00],'2'
;	mov byte [gs:0x01],0x04

;	mov byte [gs:0x02],' '
;	mov byte [gs:0x03],0x04

;	mov byte [gs:0x04],'m'
;	mov byte [gs:0x05],0x04

;	mov byte [gs:0x06],'b'
;	mov byte [gs:0x07],0x04

;	mov byte [gs:0x08],'r'
;	mov byte [gs:0x09],0x04

	mov ax, LOADER_START ;从第二个块地址开始读取
	mov bx, LOADER_BASE ;将内容读取到0x900内存地址处
	mov cx, 4 ;读取4块
	call rd_disk_m_16
	jmp LOADER_BASE+0x300
;磁盘读取函数  
rd_disk_m_16:
	mov si, ax
	mov di, cx
	

	mov dx, 0x1f2 ;设置读取区块数量
	mov al, cl
	out dx, al

	mov ax, si

	mov dx, 0x1f3 ;low lba低8位地址
	out dx, al

	mov ax, 0
	mov dx, 0x1f4 ;mid 中8位
	out dx, al

	mov dx, 0x1f5 ;high 高8位
	out dx, al

	and al, 0x0f ; 0000 1111 低四位表示lba第25-28位
	or al, 0xe0 ; 1110 0000 5:0表示主盘, 6:1未知, 7:1为lba模式, 8:1未知
	mov dx, 0x1f6
	out dx, al
	
	mov dx, 0x1f7 ;0x20表示读取，0x30表示写入
	mov al, 0x20
	out dx, al

.not_ready:
	nop
	in al, dx
	and al, 0x88 ; 1000 1000
	cmp al, 0x08 ; 0000 1000 比较al和0x08如果相等设ZF为1
	jnz .not_ready ; 判断标准寄存器ZF是否等于0,不为零跳转
	
	mov ax, di
	mov dx, 256 ;一次读取两字节读取次数，读取块地址数*512\2
	mul dx ; ax*dx,低8位放ax中,高8位在dx
	mov cx, ax
	mov dx, 0x1f0
.go_on_read:
	in ax, dx ;读取两个字节到ax
	mov [bx], ax
	add bx, 2
	loop .go_on_read
	ret

; Message: db '1 mbr'
times 510-($-$$) db 0
dw 0xaa55
